/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo.DAL;

import java.sql.SQLException;
import java.sql.Statement;
import Modelo.Ast;
import Modelo.PuestoTrabajo;
import java.sql.ResultSet;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;
import org.json.JSONArray;
import org.json.JSONObject;

/**
 *
 * @author Francis
 */
public class Ast_DAO {

    public static JSONObject listarAst(Ast ast, PuestoTrabajo pt, String limit, String offset, String order, String asc) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        JSONObject asts = new JSONObject();
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("¡Error Consultando AST!");
            return null;
        }
        try {
            String query = "SELECT "
                    + "a.id_ast, a.ci \"cedula\", c.nombre_1, c.apellido_1, "
                    + "c.email, c.telefono, p.nombre_cargo, p.nombre_puesto, "
                    + "p.sede, to_char(a.fecha_ast,'DD-MM-YYYY'), "
                    + "to_char(a.fecha_modificacion,'DD-MM-YYYY') "
                    + "from ast a, puesto_trabajo pt, personal_usb p, "
                    + "comunidad_universitaria c ";
            String params = "WHERE "
                    + "(a.ci=p.ci) and (p.ci=c.ci) and "
                    + "(p.nombre_cargo,p.nombre_puesto,p.sede)=(pt.nombre_cargo,pt.nombre_puesto,pt.sede) ";


            if (ast.getCi() != null && !ast.getCi().equals("") && !ast.getCi().equals("V-") && !ast.getCi().equals("E-")) {
                params += "and a.ci LIKE '%" + ast.getCi() + "' ";
            }
            if (ast.getRealizadoPor() != null && !ast.getRealizadoPor().equals("")) {
                params += "and lower(a.realizado_por) LIKE '%" + ast.getRealizadoPor().toLowerCase() + "%' ";
            }
            if (ast.getFechaAst() != null && !ast.getFechaAst().equals("")) {
                params += "and a.fecha_ast = '" + ast.getFechaAst() + "' ";
            }
            if (ast.getFechaModificacion() != null && !ast.getFechaModificacion().equals("")) {
                params += "and a.fecha_modificacion = '" + ast.getFechaModificacion() + "' ";
            }
            if (pt.getNombreCargo() != null && !pt.getNombreCargo().equals("")) {
                params += "and pt.nombre_cargo = '" + pt.getNombreCargo() + "' ";
            }
            if (pt.getNombrePuesto() != null && !pt.getNombrePuesto().equals("")) {
                params += "and pt.nombre_puesto = '" + pt.getNombrePuesto() + "' ";
            }
            if (pt.getSede() != null && !pt.getSede().equals("")) {
                params += "and pt.sede = '" + pt.getSede() + "'";
            }

            String format = "";
            if (order != null && !order.equals("")) {
                format += " order by " + order;
                if (asc != null && !asc.equals("") && asc.equals("false")) {
                    format += " desc";
                } else {
                    format += " asc";
                }
            }

            if (limit != null && !limit.equals("")) {
                format += " limit " + limit;
            }
            if (offset != null && !offset.equals("")) {
                format += " offset " + offset;
            }
            System.out.println(query + params + format);
            rs = s.executeQuery(query + params + format);
            JSONArray ja = new JSONArray();

            int i = 0;
            while (rs.next()) {
                JSONObject jo = new JSONObject();
                jo.put("id_ast", rs.getString(1));
                jo.put("ci", rs.getString(2));
                jo.put("nombre", rs.getString(4) + ", " + rs.getString(3));
                jo.put("email", rs.getString(5));
                jo.put("telefono", rs.getString(6));
                jo.put("cargo", rs.getString(7));
                jo.put("puesto_trabajo", rs.getString(8));
                jo.put("sede", rs.getString(9));
                jo.put("fecha", rs.getString(10));
                jo.put("modificacion", rs.getString(11));
                ja.put(i++, jo);
            }
            
            query = "select "
                    + "count(*) "
                    + "from ast a, puesto_trabajo pt, personal_usb p, "
                    + "comunidad_universitaria c "
                    + params;
            System.out.println(query + params);
            rs = s.executeQuery(query);

            asts.put("asts", ja);
            if (rs.next()) {
                asts.put("tam", rs.getString(1));
            }
            return asts;
        } catch (SQLException se) {
            System.out.println("Error Consultado el AST\n" + se.getMessage());
            return null;
        } catch (Exception e) {
            System.out.println("Error obteniendo data del AST\n" + e.getMessage());
            return null;
        }
    }

    public static JSONObject consultarAst(String idAst) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("¡Error Consultando AST!");
            return null;
        }
        try {
            String query = "SELECT "
                    + "a.*, c.nombre_1, c.apellido_1, "
                    + "p.nombre_cargo, p.nombre_puesto, p.sede "
                    + "from ast a, puesto_trabajo pt, personal_usb p, "
                    + "comunidad_universitaria c "
                    + "WHERE (a.id_ast=" + idAst + ") and (a.ci=p.ci) "
                    + "and (p.ci=c.ci) and "
                    + "(p.nombre_cargo,p.nombre_puesto,p.sede)=(pt.nombre_cargo,pt.nombre_puesto,pt.sede) ";

            System.out.println(query);
            rs = s.executeQuery(query);
            JSONObject jo = new JSONObject();
            try {
                int i = 0;
                while (rs.next()) {
                    jo.put("id_ast", rs.getString(1));
                    jo.put("ci", rs.getString(2));
                    jo.put("realizadoPor", rs.getString(3));
                    jo.put("fecha", rs.getString(4));
                    jo.put("modificacion", rs.getString(5));
                    jo.put("descripcion", rs.getString(6));
                    jo.put("factores", rs.getString(7));
                    jo.put("recomendaciones", rs.getString(8));
                    jo.put("equipo", rs.getString(9));
                    jo.put("observaciones", rs.getString(10));
                    jo.put("nombre", rs.getString(12) + ", " + rs.getString(11));
                    jo.put("cargo", rs.getString(13));
                    jo.put("puesto_trabajo", rs.getString(14));
                    jo.put("sede", rs.getString(15));
                }
            } catch (Exception e) {
                System.out.println("Error obteniendo data del AST." + e.getMessage());
            }
            return jo;
        } catch (SQLException se) {
            System.out.println("Error Consultado el AST" + se.getMessage());
            return null;
        }
    }

    public static boolean insertarAst(Ast ast) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Insertando AST!");
            return false;
        }
        String query = "INSERT INTO ast(ci, realizado_por, fecha_ast,fecha_modificacion, descripcion,"
                + " factores_riesgo, recomendaciones,  observaciones, equipo_requerido) VALUES "
                + "('" + ast.getCi() + "', '" + ast.getRealizadoPor() + "', "
                + " to_date('" + ast.getFechaAst() + "', 'dd/mm/yyyy'),"
                + " to_date('" + ast.getFechaAst() + "', 'dd/mm/yyyy'), "
                + "'" + ast.getDescripcion() + "', '" + ast.getFactoresRiesgo() + "',"
                + "'" + ast.getRecomendaciones() + "','" + ast.getObservaciones() + "',"
                + "'" + ast.getEquipoRequerido() + "');";
        System.out.println(query);
        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error Insertando AST!" + se.getMessage());
            return false;
        }
    }

    public static boolean modificarAST(Ast ast) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error actualizando el Puesto de Trabajo!");
            return false;
        }

        String query = "UPDATE ast set ";
        query += " ci ='" + ast.getCi() + "',";
        query += " realizado_por ='" + ast.getRealizadoPor() + "',";
        query += " fecha_ast ='" + ast.getFechaAst() + "',";
        query += " fecha_modificacion = current_date,";
        query += " descripcion ='" + ast.getDescripcion() + "',";
        query += " factores_riesgo ='" + ast.getFactoresRiesgo() + "',";
        query += " recomendaciones ='" + ast.getRecomendaciones() + "',";
        query += " observaciones ='" + ast.getObservaciones() + "',";
        query += " equipo_requerido ='" + ast.getEquipoRequerido() + "'";
        query += " where id_ast = '" + ast.getIdAst() + "' ;";

        System.out.println("\n***query " + query);
        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error al actualizar el AST");
            return false;
        }
    }

    public byte[] generarInforme(Map parametros) {
        ConexionBD conexion = new ConexionBD();
        byte[] pdf = null;
        String filename = "/Modulo3/informeAST.jasper";
        JasperReport masterReport = null;
        try {
            masterReport = (JasperReport) JRLoader.loadObject(getClass().getResource(filename));
            pdf = JasperRunManager.runReportToPdf(masterReport, parametros, conexion.session);
        } catch (JRException e) {
            System.out.println("Error generando el reporte:\n" + e.getMessage());
        }

        if (conexion.session != null) {
            conexion.cerrarConexion();
        }

        return pdf;
    }
}
